console.log('\x1b[31m递归\x1b[0m');
function 递归(i) {
    if (i < 0) {
        return ;
    }
    console.log(`开始 ${i}`);
    递归(i - 1);
    console.log(`结束 ${i}`);
}
递归(3);



console.log('\x1b[31m嵌套函数\x1b[0m');
function 平方和(a, b) {
    function 平方(x) {
        return x * x;
    }
    return 平方(a) + 平方(b);
}

console.log(平方和(2, 3));
console.log(平方和(3, 4));
console.log(平方和(4, 5));


function 外部(x) {
    function 内部(y) {
        return x + y;
    }
    return 内部;
}

const 内部函数 = 外部(3);
console.log(内部函数(5));
console.log(外部(3)(5));



console.log('\x1b[31m多层嵌套\x1b[0m');
function A(x) {
    function B(y) {
        function C(z) {
            console.log(x + y +z);
        }
        C(3);
    }
    B(2);
}
A(1);



console.log('\x1b[31m命名冲突\x1b[0m');
function 外侧() {
    const x = 5;
    function 内侧(x) {
        return x * 2;
    }
    return 内侧;
}
console.log(外侧()(10));
